package service;

import dao.UserDao;
import model.User;
import org.mindrot.jbcrypt.BCrypt;

import java.util.List;

/**
 * 用户服务层-处理用户相关业务逻辑
 */
public class UserService {
    private UserDao userDao = new UserDao();

    /**
     * 用户注册
     */
    public boolean register(String username, String password, String email) {
        System.out.println("开始注册用户: " + username);

        // 检查用户名是否已存在
        User existingUser = userDao.findByUsername(username);
        if (existingUser != null) {
            System.out.println("用户名已存在: " + username);
            return false;
        }

        // 检查邮箱是否已存在
        User existingEmail = userDao.findByEmail(email);
        if (existingEmail != null) {
            System.out.println("邮箱已存在: " + email);
            return false;
        }

        // 加密密码
        String encryptedPassword = BCrypt.hashpw(password, BCrypt.gensalt());
        System.out.println("密码加密完成");

        // 保存到数据库
        boolean isInserted = userDao.insertUser(username, encryptedPassword, email);
        if (isInserted) {
            System.out.println("用户注册成功: " + username);
            return true;
        } else {
            System.out.println("用户注册失败: " + username);
            return false;
        }
    }

    /**
     * 用户登录
     */
    public User login(String username, String password) {
        System.out.println("开始登录用户: " + username);

        // 根据用户名查找用户
        User user = userDao.findByUsername(username);
        if (user == null) {
            System.out.println("用户不存在: " + username);
            return null;
        }

        // 检查用户状态
        if (user.getStatus() != 1) {
            System.out.println("用户状态异常: " + username);
            return null;
        }

        // 检查密码
        String encryptedPassword = user.getPassword();
        boolean isPasswordMatch = BCrypt.checkpw(password, encryptedPassword);
        if (!isPasswordMatch) {
            System.out.println("密码错误: " + username);
            return null;
        }

        System.out.println("用户登录成功: " + username);
        return user;
    }

    /**
     * 根据用户ID查找用户
     */
    public User findById(int userId) {
        return userDao.findById(userId);
    }

    /**
     * 更新用户资料
     */
    // 修改updateProfile方法的参数名，将nickname改为username
    public boolean updateProfile(int userId, String username, String email, String avatar) {
        // 检查邮箱是否被其他用户使用
        User existingUser = userDao.findByEmail(email);
        if (existingUser != null && existingUser.getId() != userId) {
            System.out.println("邮箱已被其他用户使用: " + email);
            return false;
        }
    
        // 调用Dao层更新用户资料，使用正确的参数名
        boolean result = userDao.updateProfile(userId, username, email, avatar);
        if (result) {
            System.out.println("用户资料更新成功: " + userId);
        } else {
            System.out.println("用户资料更新失败: " + userId);
        }
        return result;
    }

    /**
     * 更新用户密码
     */
    public boolean updatePassword(int userId, String oldPassword, String newPassword) {
        // 验证旧密码
        User user = userDao.findById(userId);
        if (user == null) {
            System.out.println("用户不存在: " + userId);
            return false;
        }

        boolean isOldPasswordCorrect = BCrypt.checkpw(oldPassword, user.getPassword());
        if (!isOldPasswordCorrect) {
            System.out.println("旧密码错误: " + userId);
            return false;
        }

        // 加密新密码
        String encryptedNewPassword = BCrypt.hashpw(newPassword, BCrypt.gensalt());

        boolean result = userDao.updatePassword(userId, encryptedNewPassword);
        if (result) {
            System.out.println("密码更新成功: " + userId);
        } else {
            System.out.println("密码更新失败: " + userId);
        }
        return result;
    }

    /**
     * 重置用户密码（管理员功能）
     */
    public boolean resetPassword(int userId, String newPassword) {
        // 加密新密码
        String encryptedPassword = BCrypt.hashpw(newPassword, BCrypt.gensalt());

        boolean result = userDao.updatePassword(userId, encryptedPassword);
        if (result) {
            System.out.println("密码重置成功: " + userId);
        } else {
            System.out.println("密码重置失败: " + userId);
        }
        return result;
    }

    /**
     * 获取所有用户（管理员功能）
     */
    public List<User> getAllUsers() {
        return userDao.findAll();
    }

    /**
     * 验证用户密码
     */
    public boolean verifyPassword(int userId, String password) {
        User user = userDao.findById(userId);
        if (user == null) {
            return false;
        }
        return BCrypt.checkpw(password, user.getPassword());
    }

    /**
     * 检查用户名是否可用
     */
    public boolean isUsernameAvailable(String username) {
        User user = userDao.findByUsername(username);
        return user == null;
    }

    /**
     * 检查邮箱是否可用
     */
    public boolean isEmailAvailable(String email) {
        User user = userDao.findByEmail(email);
        return user == null;
    }
}